(*                                                                      *)
(*    Release 3.00                                                      *)
(*                                                                      *)
(*    Epoc/Os - Interface routines                                      *)
(*                                                                      *)
(*    Copyright (C) 1991 Psion PLC. All Rights Reserved                 *)
(*    Written by NSM.                                                   *)
(*                                                                      *)
(************************************************************************)

include "corelib.inc"
include "epocdefs.inc"

module Epoc

(***************************************************************************)
section
segment _TEXT(CODE,28H)
segment _DATA(DATA,28H)

__ServerName: db "SYS$FSRV.*",0
__FileDevName: db "FIL",0

segment _BSS(BSS,28H)

public  __FServerPid :  org 2		(* File server process id *)
public	__FilDeviceHandle : org 2	(* File device driver handle *)

select _TEXT

public __EpocInit :

	sub	al, al
	mov	ah, NmFilConnect
	int	FilManager
	sub	bx, bx
	sub	sp, MaxNameESize + 2
	mov	si, sp
	mov	di, __ServerName
	mov	ah, NmProcFind
	int	ProcManager
	mov	[__FServerPid], ax
	sub	bx, bx
	mov	dx, LDDSignature
	mov	di, __FileDevName
	mov	si, sp
	mov	ah, NmDevFind
	int	DevManager
	mov	[__FilDeviceHandle], ax
	add	sp, MaxNameESize + 2
	ret	0

(***************************************************************************)
section
segment _TEXT(CODE,28H)

public __allocInfo :

	push	ax
	push	bx
	push	di
	push	si
	mov	si, ax		(* Arg 1 *)
	mov	ah, NmProcId
	int	ProcManager
	mov	di, ax
	int	GenDataSegment
	and	di, PidMask
	mov	ax, es:[di][ProcMemBasePtr]
	test	ax, ax
	je	infoExit
	mov	[bx], ax
	add	ax, MemEnt
	mov	[si], ax
infoExit:
	pushf
	cli
	mov	bx, ss
	mov	es, bx
	popf
	pop	si
	pop	di
	pop	bx
	pop	ax
	ret	0

(***************************************************************************)
section
segment _TEXT(CODE,28H)

select _TEXT


public __heapTop :

	push	bx
	mov	ah, NmProcId
	int	ProcManager
	mov	bx, ax
	and	bx, PidMask
	int	GenDataSegment
	mov	bx, es:[bx][ProcDataSeg]
	pushf
	cli
	mov	ax, es:[bx][SegEnt][SegBase]
	sub	ax, es:[bx][SegBase]
	mov	bx, ss
	mov	es, bx
	popf
	shl	ax, 1
	shl	ax, 1
	shl	ax, 1
	shl	ax, 1
	pop	bx
	ret	0

(***************************************************************************)
section
segment _TEXT(CODE,28H)

public _getpid :

	mov	ah, NmProcId
	int	ProcManager
	ret	0

(***************************************************************************)
section
segment _TEXT(CODE,28H)

public __getDateAndTime :

	pop	ax
	sub	sp, DateEnt
	mov	si, sp
	sub	sp, DyScEnt
	mov	di, sp
	push	ax
	push	bx
	mov	ah, NmTimGetSystemTime
	int	TimManager
	push	cx
	push	dx
	mov	cx, ax
	mov	dx, bx
	mov	ah, NmTimSystemTimeToDaySeconds
	int	TimManager
	pop	dx
	pop	cx
	xchg	di, si
	mov	ah, NmTimDaySecondsToDate
	int	TimManager
	pop	bx
	ret	0

(***************************************************************************)
section
segment _TEXT(CODE,28H)

public __setDateAndTime :

	lea	si, [di][-DyScEnt]
	xchg	si, di
	mov	ah, NmTimDateToDaySeconds
	int	TimManager
	xchg	si, di
	mov	ah, NmTimDaySecondsToSystemTime
	int	TimManager
	push	bx
	push	cx
	push	dx
	mov	cx, ax
	mov	dx, bx
	mov	ah, NmTimSetSystemTime
	int	TimManager
	pop	dx
	pop	cx
	pop	bx
	ret	0

(****************************************************************************)
section
segment _TEXT(CODE,28H)

(* WORDREGS Structure *)

_ax    = 0
_bx    = 2
_cx    = 4
_dx    = 6
_si    = 8
_di    = 10
_cflag = 12
_flags = 14

extrn __ioerr

public _int86x :
public _int86 :
(*
int  int86(int  intnum, union REGS *inregs, union REGS *outregs)
loads 086 registers and executes interrupt. AX value is returned. If the
carry flag is set cflag is !=0 and _doserrno is set to the error code.
*)

    push di
    push si
    mov  si, bx
    mov  di, cx
    int  GenIntByNumber
    mov  [di][_flags], ax
    mov  word [di][_cflag], 0
    jnc  noCarry
    inc  word [di][_cflag]
    mov  ax, [di][_ax]
    call __ioerr
noCarry:
    mov  ax, [di][_ax]
    pop  si
    pop  di
    ret  0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public _intr :

(* REGPACK Structure *)

r_ax    = 0
r_bx    = 2
r_cx    = 4
r_dx    = 6
r_bp    = 8
r_si    = 10
r_di    = 12
r_ds    = 14
r_es    = 16
r_flags = 18

    push ax
    push bx
    push di
    push si
    mov  si, bx
    mov  di, bx
    mov  bx, [si][r_si]
    xchg bx, [si][r_bp]
    xchg bx, [si][r_di]
    mov  [si][r_di], bx
    int  GenIntByNumber
    mov  [di][r_flags], ax
    mov  ax, [di][r_di]
    xchg ax, [di][r_bp]
    xchg ax, [di][r_si]
    mov  [di][r_di], bx
    pop  si
    pop  di
    pop  bx
    pop  ax
    ret  0
    
(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __iopen :

    push dx
    push di
    mov  di, ax
    sub	 dx, dx
    mov  ah, NmIoOpen
    int  DevManager
    jc   openFailed
    mov  [di], ax
    sub  al, al
openFailed:
    cbw
    pop  di
    pop  dx
    ret  0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __iow2 :
public __iow3 :
public __iow4 :

    xchg ax, bx
    mov  ah, NmIoWithWait
    int  IoManager
    jnc	 iowOk
    cbw
iowOk:
    ret  0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __parse :

    push di
    push si
    mov  si, dx
    mov  di, cx
    mov  cx, bx
    mov  bx, ax
    sub	 al, al
    mov  ah, NmFilParse
    int  FilManager
    jc   parseFailed
    sub	 al, al
parseFailed:
    cbw
    pop  si
    pop  di
    ret  0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

DaySeconds = -DyScEnt
DateF	   = -(DyScEnt+DateEnt)
locals	   = (DyScEnt+DateEnt)

public __convTimeToDos :

	push	di
	push	si
	push	dx
	push	cx
	push	bp
	mov	bp, sp
	sub	sp, locals
	mov	cx, bx
	mov	dx, ax
        mov     ax, cx
        cmp     dh, 0A6H
        sbb     ax, 012CEH
        jnc     timeOk
        mov     cx, 012CEH
        mov     dx, 0A600H
timeOk:
	lea	di, [bp][DaySeconds]
	mov	ah, NmTimSystemTimeToDaySeconds
	int	TimManager
	mov	si, di
	lea	di, [bp][DateF]
	mov	ah, NmTimDaySecondsToDate
	int	TimManager
        xor     ah, ah
        mov     al, [di][DateHour]
        mov     cx, 6
        shl     ax, cl
        or      al, [di][DateMinute]
        dec     cx
        shl     ax, cl
        mov     bl, [di][DateSecond]
        shr     bl, 1
        or      al, bl
        xor     dh, dh
        mov     dl, [di][DateYear]
        sub     dl, 80
        mov     cx, 4
        shl     dx, cl
        or      dl, [di][DateMonth]
        inc     dx
        inc     cx
        shl     dx, cl
        or      dl, [di][DateDay]
        inc     dx
	add	sp, locals
	pop	bp
	pop	cx
	mov	di, cx
	mov	[di], dx
	pop	dx
	mov	di, dx
	mov	[di], ax
	pop	si
	pop	di
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)
segment _DATA(DATA,28H)

extrn __FServerPid
extrn __FilDeviceHandle

select _TEXT

public __FsChanToName :

	push	ax
	push	bx
	push	cx
	push	di
	push	si
	push	bx
	push	si
	mov	di, sp
	mov	si, ax
	mov	ax, [__FilDeviceHandle]
	cmp	[si][ChanLibHandle], ax
	je	isAFileHandle
	pop	si
	pop	di
	and	byte [di], 0
	jmp	chanExit
isAFileHandle:
	mov	si, [si][FilHandle]
	add	si, FsyFileName
	mov	bx, [__FServerPid]
	mov	cx, 2
	int	ProcCopyFromById
	pop	si
	pop	di
	mov	cx, MaxPathSize
	int	ProcCopyFromById
chanExit:
	pop	si
	pop	di
	pop	cx
	pop	bx
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)
segment _DATA(DATA,28H)

extrn __FServerPid
extrn __FilDeviceHandle

select _TEXT

public __FsChanToMode :

	push	bx
	push	cx
	push	di
	push	si
	mov	di, sp
	mov	si, ax
	mov	ax, [__FilDeviceHandle]
	cmp	[si][ChanLibHandle], ax
    	mov	ax, -1
	jne	modeExit
	push	ax
	mov	di, sp
	mov	si, [si][FilHandle]
	add	si, FsyFileMode
	mov	bx, [__FServerPid]
	mov	cx, 2
	int	ProcCopyFromById
	pop	ax
modeExit:
	pop	si
	pop	di
	pop	cx
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __systemTimeToDaySeconds :

	push	ax
	push	cx
	push	dx
	push	di
	mov	di, cx
	mov	dx, ax
	mov	cx, bx
	mov	ah, NmTimSystemTimeToDaySeconds
	int	TimManager
	pop	di
	pop	dx
	pop	cx
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __daySecondsToSystemTime :

	push	bx
	push	si
	mov	si, ax
	mov	ah, NmTimDaySecondsToSystemTime
	int	TimManager
	mov	dx, ax
	mov	ax, bx
	pop	si
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __daySecondsToDate :

	push	ax
	push	di
	push	si
	mov	si, ax
	mov	di, bx
	mov	ah, NmTimDaySecondsToDate
	int	TimManager
	pop	si
	pop	di
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __dateToDaySeconds :

	push	di
	push	si
	mov	si, ax
	mov	di, bx
	mov	ah, NmTimDateToDaySeconds
	int	TimManager
	mov	ax, 0
	jnc	convOk
	dec	ax
convOk:
	pop	si
	pop	di
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __date :

	push	bx
	mov	ah, NmTimGetSystemTime
	int	TimManager
	mov	dx, ax
	mov	ax, bx
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __fileInfo :

	push	bx
	push	cx
	mov	cx, bx
	mov	bx, ax
	sub	al, al
	mov	ah, NmFilStatusGet
	int	FilManager
	jc	gotFailed
	sub	al, al
gotFailed:
	cbw
	pop	cx
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __fileSetModTime :

	push	bx
	push	cx
	push	di
	mov	di, cx
	mov	cx, bx
	mov	bx, ax
	sub	al, al
	mov	ah, NmFilSetFileDate
	int	FilManager
	jc	setFailed
	sub	al, al
setFailed:
	cbw
	pop	di
	pop	cx
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __getPath :

	push	ax
	push	bx
	mov	bx, ax
	sub	al, al
	mov	ah, NmFilPathGet
	int	FilManager
	pop	bx
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __setPath :

	push	ax
	push	bx
	mov	bx, ax
	sub	al, al
	mov	ah, NmFilPathSet
	int	FilManager
	jc	setFailed
	sub	al, al
setFailed:
	cbw
	pop	bx
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __sleepTenths :

	push	ax
	push	cx
	push	dx
	mov	dx, ax
	mov	cx, bx
	mov	ah, NmTimSleepForTenths
	int	TimManager
	pop	dx
	pop	cx
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public ___execc :

	push	bx
	push	cx
	push	di
	push	ax
	mov	di, sp
	mov	cx, bx
	mov	bx, ax
	sub	al, al
	mov	ah, NmFilExecute
	int	FilManager
	jnc	gotHandle
	cbw
	mov	[di], ax
gotHandle:
	pop	ax
	pop	di
	pop	cx
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __logon :

	push	bx
	push	di
	mov	di, bx
	mov	bx, ax
	mov	ah, NmIoSignalKillAsynchronous
	int	IoManager
	jc	logonFailed
	sub	al, al
logonFailed:
	cbw
	pop	di
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __waitStat :

	push	ax
	push	di
	mov	di, ax
	mov	ah, NmIoWaitForStatus
	int	IoManager
	pop	di
	pop	ax
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __resume :

	push	bx
	mov	bx, ax
	mov	ah, NmProcResume
	int	ProcManager
	jc	resFailed
	sub	al, al
resFailed:
	cbw
	pop	bx
	ret	0

(******************************************************************************)
section
segment _TEXT(CODE,28H)

public __getErrorText :

	mov	ah, NmGenGetErrorText
	int	GenManager
	mov	ax, bx
	ret	0

end
